/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tomasio.projects.welcome.dao;

import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoDTO;
import com.tomasio.projects.welcome.dto.TranseunteDTO;
import com.tomasio.projects.welcome.model.AutorizacaoDeAcesso;
import com.tomasio.projects.welcome.util.HibernateUtil;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

/**
 *
 * @author administrador
 */
public class HibernateAutorizacaoDeAcessoDAO
        implements AutorizacaoDeAcessoDAO {

    private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    

    @Override
    public AutorizacaoDeAcessoDTO find(Long id) {
        SimpleDAOFactory daoFactory = new SimpleDAOFactory();
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        AutorizacaoDeAcesso autorizacao =
                (AutorizacaoDeAcesso) session.get(AutorizacaoDeAcesso.class, id);
        tx.commit();
        session.close();
        AutorizacaoDeAcessoDTO autorizacaoDTO = autorizacao.createDTO();
        PessoaDAO pessoaDAO = daoFactory.getPessoaDAO();
        VeiculoDAO veiculoDAO = daoFactory.getVeiculoDAO();
        TranseunteDTO transeunteDTO;
        if (autorizacao.getId() > 50000) {
            transeunteDTO = pessoaDAO.find(autorizacao.getId());
        } else {
            transeunteDTO = veiculoDAO.find(autorizacao.getId());
        }
        autorizacaoDTO.setTranseunte(transeunteDTO);
        return autorizacaoDTO;
    }

    @Override
    public void create(AutorizacaoDeAcessoDTO autorizacao) {
        AutorizacaoDeAcesso _autorizacao = AutorizacaoDeAcesso.instantiate(autorizacao);
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.save(_autorizacao);
        tx.commit();
        session.close();
    }

    @Override
    public void remove(Long id) {
        AutorizacaoDeAcessoDTO dto = find(id);
        AutorizacaoDeAcesso autorizacao = AutorizacaoDeAcesso.instantiate(dto);
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.delete(autorizacao);
        tx.commit();
        session.close();
    }

    @Override
    public void update(AutorizacaoDeAcessoDTO autorizacao) {
        AutorizacaoDeAcesso _autorizacao = AutorizacaoDeAcesso.instantiate(autorizacao);
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.update(_autorizacao);
        tx.commit();
        session.close();
    }

    @Override
    public List<AutorizacaoDeAcessoDTO> findAll() {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        List<AutorizacaoDeAcesso> autorizacoes = session.createQuery("from AutorizacaoDeAcesso autorizacao").list();
        tx.commit();
        session.close();

        List<AutorizacaoDeAcessoDTO> dtoList = new ArrayList<AutorizacaoDeAcessoDTO>();
        for (AutorizacaoDeAcesso autorizacao : autorizacoes) {
            dtoList.add(autorizacao.createDTO());
        }
        return dtoList;
    }

    @Override
    public List<AutorizacaoDeAcessoDTO> findAll(long transeunteID) {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        List<AutorizacaoDeAcesso> autorizacoes = session
                .createQuery("from AutorizacaoDeAcesso autorizacao where autorizacao.transeunteId=" + transeunteID)
                .list();
        tx.commit();
        session.close();

        List<AutorizacaoDeAcessoDTO> dtoList = new ArrayList<AutorizacaoDeAcessoDTO>();
        for (AutorizacaoDeAcesso autorizacao : autorizacoes) {
            dtoList.add(autorizacao.createDTO());
        }
        return dtoList;
    }
}
